﻿using Autofac;
using Autofac.Extras.DynamicProxy;
using JIESHINet.Extension.AOP;
using JIESHINet.IService;
using JIESHINet.Repository.Base;
using JIESHINet.Service;
using System.Reflection;
using System.Security.AccessControl;
using Module = Autofac.Module;

namespace JIESHINet.Extension.Autofac
{
    public class AutofacModuleRegister : Module
    {
        protected override void Load(ContainerBuilder builder) 
        {
            //获取应用程序程序集路径
            var basepath = AppContext.BaseDirectory;
            var servicesDllfile = Path.Combine(basepath, "JIESHINet.Service.dll");
            var repositoryDllfile = Path.Combine(basepath, "JIESHINet.Repository.dll");

            var aopTypes = new List<Type>() { typeof(ServiceAOP)/*, typeof(TranAOP) */};
            builder.RegisterType<ServiceAOP>();
            /*builder.RegisterType<TranAOP>();*/

            /*  这里使用 RegisterGeneric 方法注册了泛型仓储类 BaseRepository<> 和泛型服务类     BaseService<,>。As(typeof(IBaseRepository<>)) 和 As(typeof(IBaseService<,>)) 表示将它们分别注册为接口 IBaseRepository<> 和 IBaseService<,> 的实现。InstancePerDependency 指定了生命周期，表示每次请求时创建一个新的实例。*/
            builder.RegisterGeneric(typeof(BaseRepository<>)).As(typeof(IBaseRepository<>)).InstancePerDependency();


            builder.RegisterGeneric(typeof(BaseService<,>)).As(typeof(IBaseService<,>))
                .InstancePerDependency()
                .EnableInterfaceInterceptors()
                .InterceptedBy(aopTypes.ToArray());

            /*这里通过反射加载了 Service 程序集，并使用 RegisterAssemblyTypes 方法注册了程序集中所有实现接口的服务类。AsImplementedInterfaces() 表示注册所有实现接口的类，InstancePerDependency 仍然指定了生命周期。最后，使用了 PropertiesAutowired，表示将属性注入也交给 Autofac 处理。*/

            //通过反射获取Service.dll 程序集服务并注册。
            var assemblysService = Assembly.LoadFrom(servicesDllfile);
            //注册
            builder.RegisterAssemblyTypes(assemblysService)
                .AsImplementedInterfaces()
                .InstancePerDependency()
                .PropertiesAutowired()
                .EnableInterfaceInterceptors()
                .InterceptedBy(aopTypes.ToArray());

            //Repository.dll 程序集服务并注册。
            var assemblysRepository = Assembly.LoadFrom(repositoryDllfile);
            //注册
            builder.RegisterAssemblyTypes(assemblysRepository)
                .AsImplementedInterfaces()
                .InstancePerDependency()
                .PropertiesAutowired();

        }
    }
}
